package com.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class DateUtil {
	
	/**
     * 
     * 将date转化为指定的格式字符串，如果没有指定格式就默认yyyy-MM-dd HH:mm:ss格式
     * 
     * @param patten 时间格式，NULL为标准日期时间
     * @return
     */
    public static String formatDateToString(Date date,String patten) {
        if (patten == null) {
            patten = "yyyy-MM-dd HH:mm:ss";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(patten);
		return sdf.format(date);
    }
    
    /**
     * 将date转化为yyyy-MM-dd HH:mm:ss字符串格式
     * @param date
     * @return
     */
    public static String date2Str(Date date){
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(date);
	}
    
    /**
     * 将date转化为指定的格式
     * @param date
     * @param format
     * @return
     */
    public static String dateformat(String date,String format){
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		String str = sdf.format(date) ;
		return str;
	}
    
    /**
     * 
     * 格式化时间字符串
     * 
     * @param patten 时间格式，NULL为标准日期时间
     * @return
     */
    public static Date formatTimeToDate(String date,String patten) {
        if (patten == null) {
            patten = "yyyy-MM-dd HH:mm:ss";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(patten);
        try {
        	if(date==null)
        		return null;
        	else
        		return sdf.parse(date);
		} catch (ParseException e) {
			e.printStackTrace();
			return null;
		}
    }
    
    /**
	 * 按照自定义格式日期转字符串
	 * @param date
	 * @param format
	 * @param value
	 * @return
	 */
	public static String date2formatStr(Date date,String format,String value){
		if(date == null){
			return value;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}
	
	/**
	 * 按照自定义格式日期转字符串,尾部可追加字符
	 * @param date
	 * @param format
	 * @param appendStr
	 * @param value
	 * @return
	 */
	public static String date2formatStr(Date date,String format,String appendStr,String value){
		if(date == null){
			return value;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		String str = sdf.format(date) + appendStr;
		return str;
	}
	
	/**
	 * 按照自定义格式字符串转日期
	 * @author 李建
	 * @param value
	 * @param format
	 * @return
	 */
	public static Date str2FormatDate(String value, String format){
		if(value == null || value.equals("")){
			return null;
		}
		
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			return sdf.parse(value);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
	}
	
	/**
	 * 按照自定义格式日期转字符串
	 * @param date
	 * @param format
	 * @param value
	 * @return
	 */
	public static Date str2formatDate(Object date,String format){
		
		String value = PublicUtil.getStrValue(date, "");
		if("".equals(value)){
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		try {
			return sdf.parse(value);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	
	public static Date DateFormat(Date date,String format){
		if(date == null){
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		String str = sdf.format(date); 
		try {
			return sdf.parse(str);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
    
    /**
	 * 获取当前日期是星期几
	 * @param date
	 * @return
	 */
	public static String getWeekOfDate(Date date) {

		if (date == null) {
			return "";
		}
		SimpleDateFormat dateFm = new SimpleDateFormat("EEEE");
		return dateFm.format(date);
	}
	
	/**
	 * 获取当前是第几季度
	 * @param date
	 * @return
	 */
	public static String getQuarter(Date date){
		if (date == null) {
			return "";
		}
		int month = Integer.parseInt(date2formatStr(new Date(),"MM",""));
		return String.valueOf(month/4+1);
	} 
	
	 /**
     * 计算时间差（日，时，分，秒）
	 * @param smallDate 小时间点
	 * @param bigDate 大时间点
	 * @return Map
	 */
	public static Map<String, Object> getDistanceTime(Date smallDate, Date bigDate) { 
	   
		Map<String, Object> map = new HashMap<String, Object>();
		long diff = 0l;  
		
		try {
			diff = bigDate.getTime() - smallDate.getTime();
		} catch (Exception e) {
			// TODO: handle exception
			return map;  
		}
        map.put("day", diff / (24 * 60 * 60 * 1000));
        map.put("hour", diff / (60 * 60 * 1000));
        map.put("min", diff / (60 * 1000)+1);
        map.put("sec", diff / 1000);
        
        return map;    
    }  
	
	/**
	 * 计算时间差（日，时，分，秒）
	 * @param smallStr 小时间点
	 * @param bigStr 大时间点
	 * @return Map
	 */
	public static Map<String, Long> getDistanceTime(String smallStr, String bigStr) {  
		
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
		Map<String, Long> map = new HashMap<String, Long>();
		long diff = 0l;  
		
        try {  
            diff = df.parse(bigStr).getTime() - df.parse(smallStr).getTime();  
            System.out.println(diff);
        } catch (ParseException e) {  
            e.printStackTrace();  
            return map;
        } 
        
        map.put("day", diff / (24 * 60 * 60 * 1000));
        map.put("hour", diff / (60 * 60 * 1000));
        map.put("min", diff / (60 * 1000)+1);
        map.put("sec", diff / 1000);
        
        return map;  
    }  
	
	/**
	 * 获取某日期前，后若干天的日期
	 * @param format 日期格式
	 * @param date 某一日期
	 * @param index 前或者后的天数
	 * @return
	 */
	public static String getOtherDate(String format,Date date,int index){
		
		if(date == null){
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		Calendar c=Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.DATE,index);
		return sdf.format(c.getTime());
	}
	
	/**
	 * 获取时间戳
	 * @param format
	 * @param date
	 * @param index
	 * @return
	 */
	public static String getMillis(String user_time) {

		String str = "";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d;
		try {
			d = sdf.parse(user_time);
			long l = d.getTime();
			str = String.valueOf(l);

		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return str;
	}
	
	/**
	 * 获取某日期前，后若干天的日期
	 * @param format 日期格式
	 * @param date 某一日期
	 * @param index 前或者后的天数
	 * @return
	 */
	public static Date getOtherDate(Date date,int index){
		
		if(date == null){
			return null;
		}
		Calendar c=Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.DATE,index);
		return c.getTime();
	}
	
	/**
	 * 获取某日期前，后若干月的日期
	 * @param format 日期格式
	 * @param date 某一日期
	 * @param index 前或者后的月数
	 * @return
	 */
	public static String getOtherMonth(String format,Date date,int index){
		
		if(date == null){
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		Calendar c=Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.MONTH,index);
		return sdf.format(c.getTime());
	}
	
	/**
	 * 获取某日期前，后若干月的日期
	 * @param format 日期格式
	 * @param date 某一日期
	 * @param index 前或者后的月数
	 * @return
	 */
	public static Date getOtherMonth(Date date,int index){
		
		if(date == null){
			return null;
		}
		Calendar c=Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.MONTH, index);
		return c.getTime();
	}
	
	/**判断是否体验到期
	 * @param date 当前日期
	 * @param beforeDate 前一个日期
	 * @param afterDate 后一个日期
	 * @return
	 */
	public static boolean checkDate(Date date,Date beforeDate,Date afterDate){
		
		boolean flag = false;
		if(beforeDate == null && date == null && afterDate == null){
			return flag;
		}
		//当前日期大于前一个日期并且小于后一个日期即当前日期在前后两个日期范围内
		if(date.after(beforeDate) && date.before(afterDate)){
			flag = true;
		}
		return flag;
	}
	
	/**
	 * 日期比较
	 * @param date
	 * @param compareDate
	 * @return
	 */
	public static boolean checkDate(Date date,Date compareDate){
		
		boolean flag = false;
		if(compareDate == null && date == null ){
			return flag;
		}
		//当前日期大于比较日期
		if(date.after(compareDate)){
			flag = true;
		}
		return flag;
	}
	
	public static long dateOfDays(String date) {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        long days = 0;
        try {
	        //跨年不会出现问题
	        //如果时间为：2016-03-18 11:59:59 和 2016-03-19 00:00:01的话差值为 0
	        Date fDate=sdf.parse(sdf.format(new Date())) ;
	        
	        Date oDate = sdf.parse(date);
			days=(oDate.getTime()-fDate.getTime())/(1000*3600*24);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return days;
    }
	
	//计算过期日期
	public static Date addDate(Date date,long day) throws ParseException {
		 long time = date.getTime(); // 得到指定日期的毫秒数
		 day = day*24*60*60*1000; // 要加上的天数转换成毫秒数
		 time+=day; // 相加得到新的毫秒数
		 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		 Date date1 = new Date(time);
		 String date2 = sdf.format(date1);
		 Date date3 = sdf.parse(date2);
		 return date3; // 将毫秒数转换成日期
		}
	public static String strToStrDate(String date) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date1 = sdf.parse(date);
		String date2 = sdf.format(date1);
		return date2; // 将毫秒数转换成日期
	}
	
	//计算日期与当前时间相差分钟数
	public static long dateOfmins(String date) {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long days = 0;
        try {
	        //跨年不会出现问题
	        //如果时间为：2016-03-18 11:59:59 和 2016-03-19 00:00:01的话差值为 0
	        Date fDate=sdf.parse(sdf.format(new Date())) ;
	        Date oDate = sdf.parse(date);
			days=(fDate.getTime()-oDate.getTime())/(1000*60);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        return days;
    }
	
	public static int compareToDate(String date) throws ParseException {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		int time = -1;
		try {
			
			Date date1 = sdf.parse(date);
			Date date2 =new Date();
			time = date2.compareTo(date1);
		} catch (Exception e) {
			// TODO: handle exception
		}
		
		return time; 
	}
	
}
